package com.yubest;

/**
 * 给定两个字符串 s 和 t ，编写一个函数来判断 t 是否是 s 的字母异位词。
 *
 * 注意：若 s 和 t 中每个字符出现的次数都相同，则称 s 和 t 互为字母异位词。
 *
 *  
 *
 * 示例 1:
 *
 * 输入: s = "anagram", t = "nagaram"
 * 输出: true
 * 示例 2:
 *
 * 输入: s = "rat", t = "car"
 * 输出: false
 *  
 *
 * 提示:
 *
 * 1 <= s.length, t.length <= 5 * 10^4
 * s 和 t 仅包含小写字母
 *  
 *
 * 进阶: 如果输入字符串包含 unicode 字符怎么办？你能否调整你的解法来应对这种情况？
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/valid-anagram
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 *
 * @Author hweiyu
 * @Description
 * @Date 2021/12/17 17:47
 */
public class P0242 {

    public static void main(String[] args) {
        System.out.println(new Solution242().isAnagram("nl", "cx"));
    }
}

class Solution242 {

    /**
     * 官方解法：
     *
     * class Solution {
     *     public boolean isAnagram(String s, String t) {
     *         if (s.length() != t.length()) {
     *             return false;
     *         }
     *         int[] table = new int[26];
     *         for (int i = 0; i < s.length(); i++) {
     *             table[s.charAt(i) - 'a']++;
     *         }
     *         for (int i = 0; i < t.length(); i++) {
     *             table[t.charAt(i) - 'a']--;
     *             if (table[t.charAt(i) - 'a'] < 0) {
     *                 return false;
     *             }
     *         }
     *         return true;
     *     }
     * }
     *
     * 作者：LeetCode-Solution
     * 链接：https://leetcode-cn.com/problems/valid-anagram/solution/you-xiao-de-zi-mu-yi-wei-ci-by-leetcode-solution/
     * 来源：力扣（LeetCode）
     * 著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。
     *
     *
     * 对应题目中说到的unicode问题，使用hash表的方式即可：Map<Character, Integer> table = new HashMap<Character, Integer>();
     *
     *
     * @param s
     * @param t
     * @return
     */
    public boolean isAnagram(String s, String t) {
        if (s.length() != t.length()) {
            return false;
        }
        int[][] arr = new int[2][26];
        for (int i = 0; i < s.length(); i++) {
            arr[0][s.charAt(i) - 'a']++;
            arr[1][t.charAt(i) - 'a']++;
        }
        for (int i = 0; i < 26; i++) {
            if (arr[0][i] != arr[1][i]) {
                return false;
            }
        }
        return true;
    }
}
